home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Source Code / C / Applications / Python 1.3 / Python 1.3 PPC / Tools / bgen / ae / AEservertest.py < prev    next >
Encoding:
Python Source  |  1995-10-11  |  5.1 KB  |  220 lines  |  [TEXT/PYTH]

  1. """AEservertest - Test AppleEvent server interface
  2.  
  3. (adapted from Guido's 'echo' program).
  4.  
  5. Build an applet from this source, and include the aete resource that you
  6. want to test. Use the AEservertest script to try things.
  7. """
  8.  
  9. import addpack
  10. addpack.addpack('Tools')
  11. addpack.addpack('bgen')
  12. addpack.addpack('ae')
  13. addpack.addpack('evt')
  14. #addpack.addpack('menu')
  15. addpack.addpack('win')
  16.  
  17. import sys
  18. sys.stdout = sys.stderr
  19. import traceback
  20. import MacOS
  21. import AE
  22. from AppleEvents import *
  23. import Evt
  24. from Events import *
  25. import Menu
  26. import Dlg
  27. import Win
  28. from Windows import *
  29. import Qd
  30. import macfs
  31.  
  32. import aetools
  33. import EasyDialogs
  34.  
  35. kHighLevelEvent = 23                # Not defined anywhere for Python yet?
  36.  
  37. Quit='Quit'
  38.  
  39. def mymessage(str):
  40.     err = AE.AEInteractWithUser(kAEDefaultTimeout)
  41.     if err:
  42.         print str
  43.     EasyDialogs.Message(str)
  44.  
  45. def myaskstring(str, default=''):
  46.     err = AE.AEInteractWithUser(kAEDefaultTimeout)
  47.     if err:
  48.         return default
  49.     return EasyDialogs.AskString(str, default)
  50.  
  51. def main():
  52.     echo = EchoServer()
  53.     yield = MacOS.EnableAppswitch(-1)        # Disable Python's own "event handling"
  54.     try:
  55.         try:
  56.             echo.mainloop(everyEvent, 0)
  57.         except Quit:
  58.             pass
  59.     finally:
  60.         MacOS.EnableAppswitch(yield)    # Let Python have a go at events
  61.         echo.close()
  62.  
  63.  
  64. class EchoServer:
  65.     
  66.     suites = ['aevt', 'core', 'reqd']
  67.     
  68.     def __init__(self):
  69.         self.active = 0
  70.         #
  71.         # Install the handlers
  72.         #
  73.         for suite in self.suites:
  74.             AE.AEInstallEventHandler(suite, typeWildCard, self.aehandler)
  75.             print (suite, typeWildCard, self.aehandler)
  76.         self.active = 1
  77.         #
  78.         # Setup the apple menu and file/quit
  79.         #
  80.         self.appleid = 1
  81.         self.fileid = 2
  82.         
  83.         Menu.ClearMenuBar()
  84.         self.applemenu = applemenu = Menu.NewMenu(self.appleid, "\024")
  85.         applemenu.AppendMenu("All about echo...;(-")
  86.         applemenu.AppendResMenu('DRVR')
  87.         applemenu.InsertMenu(0)
  88.         
  89.         self.filemenu = Menu.NewMenu(self.fileid, 'File')
  90.         self.filemenu.AppendMenu("Quit/Q")
  91.         self.filemenu.InsertMenu(0)
  92.         
  93.         Menu.DrawMenuBar()
  94.         #
  95.         # Set interaction allowed (for the return values)
  96.         #
  97.         AE.AESetInteractionAllowed(kAEInteractWithAll)
  98.     
  99.     def __del__(self):
  100.         self.close()
  101.     
  102.     def close(self):
  103.         if self.active:
  104.             self.active = 0
  105.             for suite in self.suites:
  106.                 AE.AERemoveEventHandler(suite, typeWildCard)
  107.     
  108.     def mainloop(self, mask = everyEvent, timeout = 60*60):
  109.         while 1:
  110.             self.dooneevent(mask, timeout)
  111.     
  112.     def dooneevent(self, mask = everyEvent, timeout = 60*60):
  113.             got, event = Evt.WaitNextEvent(mask, timeout)
  114.             if got:
  115.                 self.lowlevelhandler(event)
  116.     
  117.     def lowlevelhandler(self, event):
  118.         what, message, when, where, modifiers = event
  119.         h, v = where
  120.         if what == kHighLevelEvent:
  121.             msg = "High Level Event: %s %s" % \
  122.                 (`code(message)`, `code(h | (v<<16))`)
  123.             self.handled_by_us = 0
  124.             try:
  125.                 AE.AEProcessAppleEvent(event)
  126.             except AE.Error, err:
  127.                 mymessage(msg + "\015AEProcessAppleEvent error: %s" % str(err))
  128.                 traceback.print_exc()
  129.             else:
  130.                 if self.handled_by_us == 0:
  131.                     print msg, "Handled by AE, somehow"
  132.                 else:
  133.                     print msg, 'Handled by us.'
  134.         elif what == keyDown:
  135.             c = chr(message & charCodeMask)
  136.             if modifiers & cmdKey:
  137.                 if c == '.':
  138.                     raise KeyboardInterrupt, "Command-period"
  139.                 else:
  140.                     self.menuhit(Menu.MenuKey(message&charCodeMask))
  141.             ##MacOS.HandleEvent(event)
  142.         elif what == mouseDown:
  143.             partcode, window = Win.FindWindow(where)
  144.             if partcode == inMenuBar:
  145.                 result = Menu.MenuSelect(where)
  146.                 self.menuhit(result)
  147.         elif what <> autoKey:
  148.             print "Event:", (eventname(what), message, when, (h, v), modifiers)
  149. ##            MacOS.HandleEvent(event)
  150.  
  151.     def menuhit(self, result):
  152.             id = (result>>16) & 0xffff    # Hi word
  153.             item = result & 0xffff        # Lo word
  154.             if id == self.appleid:
  155.                 if item == 1:
  156.                     mymessage("Echo -- echo AppleEvents")
  157.                 elif item > 1:
  158.                     name = self.applemenu.GetItem(item)
  159.                     Qd.OpenDeskAcc(name)
  160.             elif id == self.fileid:
  161.                 if item == 1:
  162.                     raise Quit
  163.     
  164.     def aehandler(self, request, reply):
  165.         print "Apple Event!"
  166.         self.handled_by_us = 1
  167.         parameters, attributes = aetools.unpackevent(request)
  168.         print "class =", `attributes['evcl'].type`,
  169.         print "id =", `attributes['evid'].type`
  170.         print "Parameters:"
  171.         keys = parameters.keys()
  172.         keys.sort()
  173.         for key in keys:
  174.             print "%s: %.150s" % (`key`, `parameters[key]`)
  175.             print "      :", str(parameters[key])
  176.         print "Attributes:"
  177.         keys = attributes.keys()
  178.         keys.sort()
  179.         for key in keys:
  180.             print "%s: %.150s" % (`key`, `attributes[key]`)
  181.         parameters['----'] = self.askreplyvalue()
  182.         aetools.packevent(reply, parameters)
  183.         
  184.     def askreplyvalue(self):
  185.         while 1:
  186.             str = myaskstring('Reply value to send (python-style)', 'None')
  187.             try:
  188.                 rv = eval(str)
  189.                 break
  190.             except:
  191.                 pass
  192.         return rv
  193.         
  194. _eventnames = {
  195.     keyDown: 'keyDown',
  196.     autoKey: 'autoKey',
  197.     mouseDown: 'mouseDown',
  198.     mouseUp: 'mouseUp',
  199.     updateEvt: 'updateEvt',
  200.     diskEvt: 'diskEvt',
  201.     activateEvt: 'activateEvt',
  202.     osEvt: 'osEvt',
  203. }
  204.  
  205. def eventname(what):
  206.     if _eventnames.has_key(what): return _eventnames[what]
  207.     else: return `what`
  208.  
  209. def code(x):
  210.     "Convert a long int to the 4-character code it really is"
  211.     s = ''
  212.     for i in range(4):
  213.         x, c = divmod(x, 256)
  214.         s = chr(c) + s
  215.     return s
  216.  
  217.  
  218. if __name__ == '__main__':
  219.     main()
  220.